iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 2
0

嗨大家今天過得好嗎?週末應該會比週間有更多腦力可以消耗,因此今天要來挑戰聊聊讓人又愛又怕的 Paging。

沒有 Paging 的日子

App 可以顯示的尺寸較 Web 來得小,因此資料的呈現上大多是以列表的形式呈現,但如果要一次拿到所有列表資料再呈現就可能會讓畫面空轉太久,使用者還會以為 App 怎麼沒有反應了導致使用體驗上不是太好,因此我們可以透過分頁的方式分批向資料庫取得資料,先拿到的資料就可以先載入畫面。分頁的做法聽起來很美好,但要怎麼流暢的換頁,在使用者還沒滑到底時就向資料庫請求下一頁的資料就是個問題。

在沒有 Paging 以前可以對 RecyclerView 新增 OnScrollListener,監聽 RecyclerView 滑動到底時再觸發請求下一頁的資料,但每個手機螢幕尺寸和畫素都不同,會影響每個畫面可以顯示的 ViewHolder 個數也不一樣,觸發請求下一頁的 response time 不一定能即時回來,就會導致 RecyclerView 已經滑動到底但在 response 回來後又能繼續往下滑的現象,反而造成使用上的困惑,因此 Google 才會在 2018 的 I/O 上推出新功能 Paging 解決列表載入的問題。

Paging 的好處

Paging 的存在是用來解決上述 RecyclerView 滑動因為分頁導致畫面載入中斷的問題,開發者不再只能被動地監聽 View 的滑動狀態才能觸發 Model 載入下一頁的事件,而是滑動時 View 回傳目前顯示到第幾個項目,Model 再判斷列表是否已到底並觸發資料載入機制。

要使用 Paging 還要搭配 PagedList ( Model )、DataSource ( Model ) 和 PagedListAdapter ( View ) 三位一體。PagedList 是一組 data set 可以用來判斷列表是否已經到底並觸發載入下一頁的 request;DataSource 是 PagedList 的載體,以 LiveData 或是 Observable 的形式提供 PagedList 更新的部分;最後是 PagedListAdapter 在處理顯示列表的部分,透過 DiffUtils 的 callback 判斷列表是否更新並顯示對應動畫。

目前找到 Paging 的 sample code 大部分是 MVVM + ViewModel 的架構真的好潮,但如果是 MVP 的架構有辦法搭配 Paging 嗎?還有新推出的 Paging3 跟之前的版本有哪些差異?讓我們繼續看下去。


上一篇
什麼是好的 Android App?!
下一篇
換頁Paging (2):MVP 也可以
系列文
打造一個厲害的普通 Android App - 使用者體驗優化16
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言